package BDD.gestionnaires; 

import javax.ejb.Stateless;

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import BDD.modeles.*;  
import java.util.Date;
import javax.ejb.EJB;

/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Stateless
public class GestionnaireCommentaire {

    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext  
    private EntityManager em;
    
    // Le lien avec le gestionnaire des notifications
    @EJB
    private GestionnaireNotification gestionnaireNotification;
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    
    /* LES METHODES */
    
    public Commentaire creeCommentaire(Utilisateur user, Photo pt, String content) {  
        
        Photo photo = em.merge(pt);
        
        // Creer la photo
        Commentaire c = new Commentaire(user, photo, new Date(), content);
        
        // Ajouter la photo dans l'album
        photo.addCommentaires(c);
        
        // Persister la photo
        em.persist(c);  
        return c;  
    }
    
  
    public Collection<Photo> getAllCommentaires() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select c from Commentaire c");  
        return q.getResultList();  
    }  
    
    /**
     * Methode permettant de recuperer une commentaire par son id
     * @param idComm
     * @return le commentaire ou null
     */
    public Commentaire recupererCommentaire(int idComm){ 

        // Initialiser le retour
        Commentaire n = null;
        
        // Essayer de recuperer
        String rq = "SELECT c FROM Commentaire c WHERE c.id=:idComm";
        Query q = em.createQuery(rq);
        q.setParameter("idComm", idComm);
        q.setMaxResults(1);

        // Verifier s'il y a un resultat
        try{
            n = (Commentaire) q.getSingleResult();
        } 
        catch(javax.persistence.NoResultException e){}

        // Renvoyer le resultat
        return n;
    }
    
    /**
     * Methode permettant de supprimer un commentaire
     * @param c  
     */
    public void supprimerCommentaire(Commentaire c){
        
        // --- Reconnecter le commentaire --- //
        Commentaire commentConnecte = em.merge(c);
        commentConnecte = em.find(Commentaire.class, commentConnecte.getId());
        
        // --- Suppression du commentaire --- //
        // ---------------------------------- //
        
        // Retirer le commentaire de l'utilisateur
        Utilisateur utilisateurConnecte = em.merge(commentConnecte.getUtilisateur());
        utilisateurConnecte = em.find(Utilisateur.class, utilisateurConnecte.getId());
        utilisateurConnecte.removeCommentaires(commentConnecte);

        // Retirer le commentaire de la photo
        Photo photoConnecte = em.merge(commentConnecte.getPhoto());
        photoConnecte = em.find(Photo.class, photoConnecte.getId());
        photoConnecte.removeCommentaires(commentConnecte);

        // Effacer la notification liee
        /*try{
            Notification notifConnecte = em.merge(commentConnecte.getNotification());
            notifConnecte = em.find(Notification.class, notifConnecte.getId());
            gestionnaireNotification.supprimerNotification(notifConnecte);
        }
        catch(Exception e){}*/
        if(commentConnecte.getNotification() != null){
            try{
                Notification notifConnecte = em.merge(commentConnecte.getNotification());
                notifConnecte = em.find(Notification.class, notifConnecte.getId());
                gestionnaireNotification.supprimerNotification(notifConnecte);
            }
            catch(Exception e){}
        }
        
        // Supprimer le commentaire de la base
        em.remove(commentConnecte);
        
    }
    
}
